package com.yintao.ytframe.base.design.factory;

import com.yintao.ytframe.base.design.factory.dest.PrizeFactory;
import com.yintao.ytframe.base.design.factory.normal.PrizeService;
import com.yintao.ytframe.base.design.factory.normal.bo.AwardReq;

import java.util.HashMap;
import java.util.UUID;

/**
 * @Description
 * @Author yintao12
 * @Date 2021/1/4 19:33
 * @Doc 工厂模式又称工厂方法模式，是一种创建型设计模式，其在父类中提供一个创建对象的⽅法， 允许子类决定实例化对象的类型。
 * 这种设计模式也是 Java 开发中最常⻅见的一种模式，它的主要意图是定义一个创建对象的接口，让其子类自己决定实例化哪一个工厂类，
 * 工厂模式使其创建过程延迟到子类进行。
 * 简单说就是为了提供代码结构的扩展性，屏蔽每一个功能类中的具体实现逻辑。让外部可以更加简单的只是知道调用即可，
 * 同时，这也是去掉众多 ifelse 的方式。
 * 当然这可能也有一些缺点，比如需要实现的类非常多，如何去维护，怎样减低开发成本。但这些问题都可以在后续的设计模式结合使⽤用中，逐步降低
 **/
public class FactoryMain {

    //模拟积分兑换中的发放多种类型商品 优惠券 实物商品、第三⽅爱奇艺兑换卡
    public static void main(String[] args) throws Exception {

        PrizeService prizeService = new PrizeService();
        AwardReq req = new AwardReq();
        req.setAwardType(1);
        req.setUId("yintao");
        req.setCouponNumber("2");
        req.setUuid(UUID.randomUUID().toString());
//        prizeService.awardToUser(req);
        PrizeFactory factory = new PrizeFactory();
        factory.newPrizeService(req.getAwardType()).awardUser(req.getUId(), req.getCouponNumber(), req.getUuid(), new HashMap<>());

        req.setAwardType(2);
        req.setUId("yintao");
        req.setAddress("北京市");
        req.setSkuNo("123");
//        prizeService.awardToUser(req);
        factory.newPrizeService(req.getAwardType()).awardUser(req.getUId(), req.getCouponNumber(), req.getUuid(), new HashMap<>());

        req.setAwardType(3);
        req.setUId("yintao");
        req.setCardId("aqy123");
        req.setBindMobileNumber("1381234");
//        prizeService.awardToUser(req);
        factory.newPrizeService(req.getAwardType()).awardUser(req.getUId(), req.getCouponNumber(), req.getUuid(), new HashMap<>());


    }

}
